#include "widget.h"
#include "ui_widget.h"
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QMessageBox>
const QString SERVER_IP="127.0.0.1";
//const QString SERVER_IP="172.27.81.228";
const quint16 SERVER_PORT=9090;
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //创建垂直布局管理器
    QVBoxLayout *vlayout=new QVBoxLayout(this);
    //创建控件
    list_widget=new QListWidget();
    //list_widget->resize(600,500);

    //创建水平布局管理器
    QHBoxLayout *hlayout=new QHBoxLayout();
    //创建控件
    line_edit=new QLineEdit();
    line_edit->setPlaceholderText("请输入要发送的信息");
    button=new QPushButton();
    button->setText("发送");
    //添加
    hlayout->addWidget(line_edit,4);
    hlayout->addWidget(button,1);

    //添加到垂直管理器中
    vlayout->addWidget(list_widget);
    vlayout->addLayout(hlayout);
    //显示
    this->setLayout(vlayout);

    //1、设置窗口标题
    this->setWindowTitle("客户端");
    //2、创建socket网络通信的对象
    tcpsocket=new QTcpSocket(this);
    //3、设置对端的ip地址和端口号
    tcpsocket->connectToHost(SERVER_IP,SERVER_PORT);
    //调用tcpsocket->connectToHost(SERVER_IP,SERVER_PORT);后，此系统内核就会和对方服务器之间进行TCP三次握手了
    //三次握手也是需要消耗时间的
    //此处这个函数不会进行阻塞式的等待三次握手完毕，这是一个非阻塞函数
    //原生的Linux 的API connect函数是会进行阻塞IO通信的
    //为了拿到这里三次握手的结果，如果成功则继续，如果失败就返回，
    //所以在这里需要调用tcpsocket->waitForConnected();来进行阻塞式的等待三次握手的结果
    //4、设置消息到来时的信号槽函数
    connect(tcpsocket,&QTcpSocket::readyRead,this,[=](){
        //1、获取响应信息
        QString response=tcpsocket->readAll();
        //2、将响应信息答应到list_widget上
        list_widget->addItem("response: "+response);
    });
    //5、等待连接建立的结果，确认是否三次握手建立连接成功
    bool ret=tcpsocket->waitForConnected();
    if(ret==false)
    {
        QMessageBox::critical(this,"连接服务器出错",tcpsocket->errorString());
        return;
    }
    connect(button,&QPushButton::clicked,this,&Widget::handler_send);
}

Widget::~Widget()
{
    delete ui;
}

//发送功能
void Widget::handler_send()
{
    //1、获取输入框中的信息
    const QString text=line_edit->text();
    //2、发送数据给服务器
    tcpsocket->write(text.toUtf8());
    //3、将消息显示到list_widget控件上
    list_widget->addItem("client: "+text);
    //4、清空输入框中的内容
    line_edit->clear();
}

